1
Une transaction est une unité de travail
DSAI2202Transactions in SQL Databases
00:00

Les modifications de données arrivent rarement seules : un virement doit débiter un compte et créditer un autre, et une commande doit réserver du stock et enregistrer un paiement. Si le système s'arrête à mi-chemin, la base de données décrit alors un monde qui n'a jamais existé. Une transaction est la réponse de la base de données à ce problème — une séquence d'une ou plusieurs opérations que la base de données traite comme une unité de travail unique et indivisible.

Tout, ou rien

Au sein d'une transaction, chaque opération appartient à un même résultat. La base de données n'expose jamais un état final dans lequel seule une partie de la transaction a eu lieu. L'illustration classique est un virement entre deux comptes bancaires : réduire le solde du compte source, puis augmenter le solde du compte destinataire. Si seule la première étape réussissait, l'argent disparaîtrait ; si seule la seconde, l'argent apparaîtrait de nulle part. Regrouper les deux étapes dans une seule transaction élimine ces deux possibilités.

Cette garantie du tout ou rien est appelée atomicité. Valider est l'acte qui rend permanentes les modifications de la transaction ; une transaction jamais validée ne laisse aucune trace. Durabilité apporte la pièce finale : une fois la validation effectuée, la modification survit même si la machine perd l'alimentation un instant plus tard.

Une transaction est une unité de travailUne transaction est une unité de travailAtomicité : tout, ou rien.Frontière de la transactionune unité de travailÉtape 1 — Débiter le compte sourceÉtape 2 — Créditer le compte destinataireDes états intermédiaires existent à l'intérieur de la frontière,mais ils sont propres à cette transaction.✓COMMITLes deux modifications sont permanentesSurvit à un plantage après la validation↺ROLLBACKAucun des deux comptes n'a été modifiéNe laisse aucune traceUne transaction est une séquence d'une ou plusieurs opérations traitées comme une unité de travail unique et indivisible.

Une transaction est une frontière

Il est utile de se représenter une transaction comme une frontière tracée autour d'un groupe d'instructions. Avant et après cette frontière, les données satisfont les règles imposées par la structure. À l'intérieur de la frontière, des états intermédiaires existent — un compte est déjà débité alors que l'autre n'est pas encore crédité — mais ces états sont propres à la transaction. Les instructions ultérieures des autres sessions ne les considèrent pas comme la vérité.

Deux rôles à la fois

Les transactions remplissent donc deux rôles. Le premier est la gestion des défaillances: si le processus plante, si la connexion est interrompue ou si une instruction génère une erreur, la base de données peut restaurer l'état qui existait avant le début de la transaction. Le second est le contrôle de la visibilité: pendant que le travail est en cours, les autres lecteurs sont protégés du résultat inachevé. Ces deux rôles sont liés mais non identiques — l'atomicité décide si les modifications sont conservées, tandis que la visibilité est régie par l'isolation, le paramètre qui contrôle dans quelle mesure les transactions concurrentes peuvent se voir mutuellement.

Gardez l'unité sur une seule connexion
L'état de la transaction appartient à une connexion ou à une session, donc l'instruction qui ouvre la transaction et la validation qui la termine doivent s'exécuter sur la même connexion. De nombreux pilotes fonctionnent également en mode autocommit , où chaque instruction constitue sa propre transaction — une unité comportant plusieurs instructions nécessite la désactivation de l'autocommit ou un démarrage explicite.